package com.jacksay.vikingfl.autocompletermulti
{
	import com.jacksay.vikingfl.autocompleter.AutoCompleterRemoteMode;
	import com.jacksay.vikingfl.textinput.PromptTextInput;
	
	import flash.events.MouseEvent;
	
	import mx.collections.SortField;
	
	
	
	/**
	 * Cette classe DOIT être utilisé dans les AutoCompleterRemoteMulti
	 */
	public class AutoCompleterRemoteMultiField extends PromptTextInput
	{
		
		// ---------------------------------------------------------------------
		// sorter
		// ---------------------------------------------------------------------
		
		
		public var sorter:SortField = new SortField(null,true);
		
		
		/**
		 * Détermine si la recherche est sensible à la case
		 * 
		 * @defaultValue false
		 * @author jacksay14
		 */
		[Inspectable(enumeration=true,false, defaultValue=false, type="Boolean")]
		public function get searchSensitiveCase() :Boolean {
			return !sorter.caseInsensitive;
		}
		
		/**
		 * @private
		 */
		public function set searchSensitiveCase( value:Boolean ) :void {
			sorter.caseInsensitive = !value;
		}
		
		/**
		 * Nom de la propriété gérée par le champ
		 * 
		 * @type String
		 * @default null
		 */
		public function get propertyName():String{
			return _propertyName;
		}
		
		/**
		 * @private
		 */
		public function set propertyName( value:String ) :void {
			_propertyName = value;
			sorter.name = value;
		}
		
		/**
		 * @private
		 */
		private var _propertyName:String;
		
		
		/**
		 * Retourne la sequence pour une recherche dans une base de donnée
		 * 
		 * @type String
		 * @author jacksay14
		 */
		public function get searchPatternDB() :String {
			var out:String = "";
			if( searchMode != AutoCompleterRemoteMode.BEGIN_BY ){
				out = out.concat('%');
			}
			out = out.concat(text, '%');
			return out;
		}
		
		
		
		/**
		 * Détermine à combien de caractère la requète est executée. Cette 
		 * information est évalué dans l'AutoCompleterMultiField.
		 * 
		 * @type int
		 * @default 2
		 */
		public function get searchStartAt():int{
			return _searchStartAt;
		}
		
		/**
		 * @private
		 */
		public function set searchStartAt( value:int ) :void {
			_searchStartAt = value;
		}
		
		/**
		 * @private
		 */
		private var _searchStartAt:int = 2;
		
		
		/**
		 * Définit la méthode de recherche : 
		 * - contain : Cherche text n'importe où dans la chaine
		 * - beginBy : Commence par text
		 */
		[Inspectable(enumeration='contain,beginBy', defaultValue='contain', type="Boolean")]
		public var searchMode:String = "contain";
		
		
		
		public function AutoCompleterRemoteMultiField()
		{
			super();
			addEventListener(MouseEvent.CLICK, handlerMouseEventClick);
		}
		
		protected function handlerMouseEventClick( e:MouseEvent ) :void {
			if( hasSelectedItem ){
				setSelection(0, text.length);
			}
		}
		
		
		public function filterData( o:* ) :Boolean {
			if( text == "" ) return true;
			
			var pattern:String = ""; 
			var flag:String = 'g';
			var regEx:RegExp;
			var value:String = getFormatData(o);
			
			if( searchMode == AutoCompleterRemoteMode.BEGIN_BY ) pattern = pattern.concat('^');
			if( !searchSensitiveCase ) flag = flag.concat('i');
			
			pattern = pattern.concat(text);
			regEx = new RegExp(pattern, flag);
			
			return value.match(regEx).length > 0;
		}
		
		public function getFormatData( o:Object ):String {
			return o[propertyName].toString();
		}
		
		override protected function invalidateStyle():void {
			if( hasSelectedItem ){
				styleSelected();
			} else {
				super.invalidateStyle();
			}
		}
		
		
		
		public function get hasSelectedItem() :Boolean {
			return _hasSelectedItem;
		}
		private var _hasSelectedItem:Boolean = false;
		public function set hasSelectedItem( value:Boolean ) :void {
			if( value != _hasSelectedItem ){
				_hasSelectedItem = value;
				invalidateStyle();
			}
		}
		
		
		
		// ---------------------------------------------------------------------
		//
		// STYLE
		//
		// ---------------------------------------------------------------------
		/**
		 * Applique le style si un item est selectionné
		 */
		protected function styleSelected() :void {
			setStyle("fontStyle","none");
			setStyle("fontWeight","bold");
			setStyle("color","none");
		}
	}
}